<!--
 * @Description: 事件流-事件捕获
 * @Author: rendc
 * @Date: 2025-11-04 10:25:14
 * @LastEditors: rendc
 * @LastEditTime: 2025-11-04 14:38:00
-->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>事件流-事件捕获</title>
  <style>
    .outer,.middle,.inner{
      border: 1px solid white;
      border-radius: 50%;
    }
    .outer{
      width: 200px;
      height: 200px;
      background-color: #8de80d95;
    }
    .middle{
      margin: 25px;
      width: 150px;
      height: 150px;
      background-color: #05dcf079;
    }
    .inner{
      margin: 25px;
      width: 100px;
      height: 100px;
      background-color: #e25dca86;
    }
  </style>
</head>
<body>
  <button id="changeBtn">事件捕获-点击切换为事件冒泡模式</button>
  <div id="outer" class="outer">
    <!-- 外 -->
    <div id="middle" class="middle">
      <!-- 中 -->
      <div id="inner" class="inner">
        <!-- 内 -->
      </div>
    </div>
  </div>
  <script>
    var changeBtn = document.getElementById("changeBtn");
    // var flag = true; //事件捕获
    var flag = false; //事件冒泡
     // 1. 获取事件源
    var divOuter = document.getElementById("outer");
    var divMiddle = document.getElementById("middle");
    var divInner = document.getElementById("inner");
    // 3. 声明事件处理程序
    function clickOuter() {
      console.log('🤡 CC - clickOuter:');
    }
    function clickMiddle() {
      console.log('🤡 CC - clickMiddle:');
    }
    function clickInner() {
      console.log('🤡 CC - clickInner:');
    }
    // 给切换按钮绑定事件处理函数
    changeBtn.onclick=function(){
      // 点击按钮时触发
      // console.log('🤡 CC - 点击按钮时触发:');
      var changeBtnText = changeBtn.innerHTML;
      // console.log('🤡 CC - changeBtnText:', changeBtnText);
      if(changeBtnText == "事件捕获-点击切换为事件冒泡模式"){
        // console.log('🤡 CC - if:',);
        changeBtn.innerHTML ="事件冒泡-点击切换为事件捕获模式";
        // 修改事件模式
        flag = true; //事件捕获
       // 移除旧的事件监听
        removeMethod()
        // 绑定新的事件监听
        addMethod();
      }else{
        // console.log('🤡 CC - else:',);
        changeBtn.innerHTML ="事件捕获-点击切换为事件冒泡模式";
        // 修改事件模式
        flag = false; //事件冒泡
        // 移除旧的事件监听
        removeMethod()
        // 绑定新的事件监听
        addMethod();
      }
    }
    // 2. 添加事件监听器
    addMethod();
    function removeMethod(){
      // flag
      // console.log('🤡 CC - removeMethod - flag true-事件捕获|false-事件冒泡:', flag);
      // // 4. 移除旧的事件监听 - true - 移除事件捕获 
      // divOuter.removeEventListener("click",clickOuter,true);
      // divMiddle.removeEventListener("click",clickMiddle,true);
      // divInner.removeEventListener("click",clickInner,true);
      // 4. 移除旧的事件监听 - false - 移除事件冒泡
      // divOuter.removeEventListener("click",clickOuter,false);
      // divMiddle.removeEventListener("click",clickMiddle,false);
      // divInner.removeEventListener("click",clickInner,false);
      // 使用flag移除对应的模式
      divOuter.removeEventListener("click",clickOuter,!flag);
      divMiddle.removeEventListener("click",clickMiddle,!flag);
      divInner.removeEventListener("click",clickInner,!flag);
      console.log('🤡 CC - 当前是',flag?'捕获':'冒泡','模式');
    }
    function addMethod(){
      // 2. 添加事件监听器
      divOuter.addEventListener("click",clickOuter,flag);
      divMiddle.addEventListener("click",clickMiddle,flag);
      divInner.addEventListener("click",clickInner,flag);
    }
  </script>
</body>
</html>